# -*- coding: utf-8 -*-
import logging
import os


class Logger(object):
    """
    日志工具类：封装logging模块，用于程序运行日志的记录
    支持输出日志到文件，可指定日志级别和格式
    """
    # 日志级别映射关系
    level_relations = {
        'debug': logging.DEBUG,  # 调试级别（最详细）
        'info': logging.INFO,  # 信息级别（常规运行信息）
        'warning': logging.WARNING,  # 警告级别（潜在问题）
        'error': logging.ERROR  # 错误级别（程序错误）
    }

    def __init__(self, root_path, log_name, level='info',
                 fmt='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'):
        """
        初始化日志实例
        :param root_path: 日志根目录（日志文件会保存在该目录下的log文件夹）
        :param log_name: 日志文件名（不含后缀）
        :param level: 日志级别，默认'info'
        :param fmt: 日志格式，默认包含时间、级别、文件行号和消息
        """
        self.root_path = root_path
        self.log_name = log_name
        self.fmt = fmt

        # 初始化logger对象
        self.logger = logging.getLogger(log_name)
        self.logger.setLevel(self.level_relations.get(level, logging.INFO))  # 设置默认级别

    def get_logger(self):
        """获取配置好的logger实例（添加文件处理器）"""
        # 避免重复添加处理器
        if self.logger.handlers:
            return self.logger

        # 创建日志目录
        log_dir = os.path.join(self.root_path, 'log')
        os.makedirs(log_dir, exist_ok=True)
        log_file = os.path.join(log_dir, f'{self.log_name}.log')

        # 创建文件处理器
        file_handler = logging.FileHandler(log_file, encoding='utf-8', mode='a')
        file_handler.setLevel(self.logger.level)  # 继承logger级别

        # 设置日志格式
        formatter = logging.Formatter(self.fmt)
        file_handler.setFormatter(formatter)

        # 添加处理器到logger
        self.logger.addHandler(file_handler)

        return self.logger